// 模拟用户数据
// 需要在这里体现出来， 当前角色的权限信息，
// 权限信息， 其实就是一个字段
const Mock = require('mockjs')
let userList = [{
	username: 'admin',
	password: 'admin',
	nickname: '管理员',
	avator: 'https://robohash.org/1231231?set=set4',
	// 角色
	role: 'admin'
}, {
	username: 'zhangsan',
	password: 'zhangsan',
	nickname: '有梦想的阿三',
	avator: 'https://robohash.org/1231231?set=set3',
	// 角色
	role: 'user'
}, {
	username: 'lisi',
	password: 'lisi',
	nickname: '小思思',
	avator: 'https://robohash.org/1231231?set=set3',
	// 角色
	role: 'user'
}, {
	username: 'test',
	password: 'test',
	nickname: '一个合格的测试员',
	avator: 'https://robohash.org/1231231?set=set3',
	// 角色
	role: 'test'
}]
const bodyParser = require('body-parser')
// token 插件
const JWT = require('jsonwebtoken')
// 秘钥
const key = 'wkdnqlwdlqmqweqweqweqweqewq';
let { list } = require('./mock')
module.exports = app => {
	// 处理json 数据
	app.use(bodyParser.json())
	// 登录接口
	app.post('/api/login', (req, res) => {
		// 获取前端发送过来的账户密码
		const { username, password } = req.body;
		// 查找该用户是否存在模拟用户列表中
		const item = userList.find(v => {
			return v.username === username && v.password === password
		})
		// 验证
		if (item) {
			// 存在
			res.send({
				code: 200,
				message: '欢迎' + item.nickname,
				data: {
					// 存在返回用户信息
					username: item.username,
					avator: item.avator,
					nickname: item.nickname,
					role: item.role,
					token: JWT.sign({
						// 存在返回用户信息
						username: item.username,
						avator: item.avator,
						nickname: item.nickname,
						role: item.role,

					}, key)
				}
			})
		} else {
			// 不存在
			res.send({
				code: 401,
				message: '账号密码错误， 请重新登录',
				data: null
			})
		}
	})

	// 列表请求接口
	app.get('/api/list', (req, res) => {
		let newList = [...list];
		// 获取查询参数
		const { q, type } = req.query
		// 是否模糊搜索
		if (q) {
			newList = newList.filter(v => {
				return JSON.stringify(v).includes(q)
			})
		}
		// 是否tab切换
		if (type && type !== '全部') {
			newList = newList.filter(v => {
				return v.type === type
			})
		}
		res.send({
			code: 200,
			data: newList,
			message: '数据获取成功'
		})
	})

	// 列表删除接口
	app.delete('/api/list/:id', (req, res) => {
		// 1. 获取动态路由参数
		const { id } = req.params;
		// 2.过滤 id
		// id = "12345"
		// id = "12345, 56789, 1231231231"
		list = list.filter(v => !id.includes(v.id))
		// 3. 回复下
		res.send({
			code: 200,
			message: '删除成功!!',
			data: {
				id
			}
		})
	})

	// 列表编辑接口
	app.post('/api/list/:id', (req, res) => {
		const { id } = req.params;
		const item = list.find(v => v.id === id);
		Object.assign(item, req.body);
		res.send({
			code: 200,
			message: '数据修改成功！！！'
		})
	})

	// 列表添加接口
	app.post('/api/list', (req, res) => {
		req.body.id = Mock.Random.id();
		list.unshift(req.body)
		res.send({
			code: 200,
			data: req.body,
			message: '添加数据成功'
		})
	})
	// 列表图表接口
	app.get('/api/list/echarts/area', (req, res) => {
		const arr = list.reduce((p, n) => {
			const province = n.address.split(' ')[0];
			const item = p.find(v => v.name === province);
			if (item) {
				item.count++
			} else {
				p.push({
					name: province,
					count: 1
				})
			}
			return p
		}, [])

		res.send({
			code: 200,
			message: '数据获取成功',
			data: arr
		})
	})

	app.get('/api/list/echarts/type', (req, res) => {
		const arr = list.reduce((p, n) => {
			const item = p.find(v => v.name === n.type);
			if (item) {
				item.count++
			} else {
				p.push({
					name: n.type,
					count: 1
				})
			}
			return p
		}, [])

		res.send({
			code: 200,
			message: '数据获取成功',
			data: arr
		})
	})

	app.get('/api/user/list', (req, res) => {
		res.send({
			code: 200,
			message: '数据获取成功',
			data: userList.map(v => {
				return {
					username: v.username,
					nickname: v.nickname,
					avator: v.avator,
					role: v.role,
				}
			})
		})
	})

	app.delete('/api/user/list/:username', (req, res) => {
		const { username } = req.params
		userList = userList.filter(v => v.username !== username);
		res.send({
			code: 200,
			message: '删除成功'
		})
	})

	// 列表编辑接口
	app.post('/api/user/list/:username', (req, res) => {
		const { username } = req.params;
		const item = userList.find(v => v.username === username);
		Object.assign(item, req.body);
		res.send({
			code: 200,
			message: '数据修改成功！！！'
		})
	})
}